package com.nio.buffer;


import java.nio.ByteBuffer;

public class BufferDemo03 {

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocateDirect(100);

        System.out.println("position=" + buffer.position());
        System.out.println("capacity=" + buffer.position());
        System.out.println("limit=" + buffer.limit());

        byte[] src = new byte[] {1, 2, 3, 4, 5};
        buffer.put(src);
        // position = 0~4，都填充了数据
        System.out.println("position=" + buffer.position());

        // position = 5，此时如果你直接读数据，是读不到的，是空的没有数据
        // 手动操作一下position，调整到position = 0的地方，开始读数据
        buffer.position(0);
        buffer.put(Byte.valueOf(15+""));
        buffer.put(Byte.valueOf(16+""));
        buffer.put(Byte.valueOf(17+""));

        // 写完3条数据后，position会推进到3
        // 此时flip，会让limit也变成3，position会变成0
        buffer.flip();
        read(buffer);

        // 如果还想再次读一遍刚才的3条数据
        buffer.rewind();
        read(buffer);

        // 还原
        buffer.clear();
        System.out.println("position=" + buffer.position());
        System.out.println("capacity=" + buffer.position());
        System.out.println("limit=" + buffer.limit());
    }

    private static void read(ByteBuffer buffer){
        byte[] dst = new byte[3];
        // 默认尝试从postion=0开始，读取5条数据放入到dst数组中
        // 但是此时limit=3，限制了你只能读前3条数据
        buffer.get(dst);
        System.out.println("position=" + buffer.position());

        System.out.print("dst=[");
        for(int i = 0; i < dst.length; i++) {
            System.out.print(i);
            if(i < dst.length - 1) {
                System.out.print(",");
            }
        }
        System.out.println("]");
    }
}
